package com.j2ee.spring.aop.xml;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class Transaction {
	
	/**
	 * 前置通知
	 */
	public void beginTransaction(JoinPoint joinPoint) {
		joinPoint.getTarget() ; //目标类
		joinPoint.getArgs() ; //连接点参数
		joinPoint.getSignature().getName() ; //连接点方法名称
		System.out.println("begin transaction");
	}
	
	/**
	 * 后置通知
	 */
	public void commit(JoinPoint joinPoint, Object val) {
		joinPoint.getTarget() ; //目标类
		joinPoint.getArgs(); //连接点参数
		joinPoint.getSignature().getDeclaringType() ; //连接点声明类型——实现目标类的接口声明或继承的目标类的声明
		joinPoint.getSignature().getDeclaringTypeName() ; //连接点声明类型名称——接口名称或继承的目标类的名称
		joinPoint.getSignature().getName() ; //连接点名称
		System.out.println("commit");
		System.out.println("目标方法返回值：" + val);
	}
	
	/**
	 * 最终通知
	 */
	public void finallyMethod() {
		System.out.println("finally method");
	}
	
	/**
	 * 异常通知
	 */
	public void throwingMethod(JoinPoint joinPoint, Throwable ex) {
		System.out.println("throwing method");
		System.out.println(ex);
	}
	
	/**
	 * 环绕通知
	 * @throws Throwable 
	 */
	public void aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
		System.out.println("目标方法执行之前");
		joinPoint.proceed() ; //执行目标方法
		System.out.println("目标方法执行之后");
	}

}
